package com.aizuda.boot.modules.third.wps.controller;

import cn.hutool.core.util.ObjectUtil;
import com.aizuda.boot.modules.business.contract.util.AuthUtil;
import com.aizuda.boot.modules.third.wps.domain.dto.FileUploadMultiPhase;
import com.aizuda.boot.modules.third.wps.domain.vo.FileInfoVo;
import com.aizuda.boot.modules.third.wps.domain.vo.ResponseDTO;
import com.aizuda.boot.modules.third.wps.enums.WebOfficeErrEnum;
import com.aizuda.boot.modules.third.wps.enums.WebOfficeHeader;
import com.aizuda.boot.modules.third.wps.service.MultiPhaseFileStorageService;
import com.aizuda.boot.modules.third.wps.service.PreviewService;
import com.aizuda.boot.modules.third.wps.exception.WebOfficeException;
import com.aizuda.boot.modules.third.wps.service.FileHistoryService;
import com.baomidou.kisso.SSOHelper;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

/**
 * @author hjw
 * @description 文档编辑回调处理
 * @date 2025年06月18日 13:49
 */
@Tag(name = "WebOffice三阶段保存接口", description = "WebOffice三阶段保存接口")
@RestController
@RequestMapping("third/wps/v3/3rd/files")
public class FileStorageController {

    @Autowired
    private MultiPhaseFileStorageService multiPhaseFileStorageService;
    @Autowired
    private FileHistoryService fileHistoryService;
    @Autowired
    private PreviewService previewService;

    /**
     * 准备上传阶段
     * 三阶段保存的第一步主要用于 WebOffice 与接入方进行参数协商，目前主要协商摘要算法
     *
     * @param fileId 文件 ID
     * @return ResponseDTO<Map < String, Object>>
     */
    @Operation(summary = "准备上传阶段", description = "三阶段保存的第一步主要用于 WebOffice 与接入方进行参数协商，目前主要协商摘要算法")
    @GetMapping("{fileId}/upload/prepare")
    public ResponseDTO<Map<String, Object>> prepareUpload(@PathVariable String fileId) {
        // 校验文件 ID 是否有效
        previewService.validateFileId(fileId);

        return ResponseDTO.success(Map.of(
                "digest_types", multiPhaseFileStorageService.uploadPrepare(fileId)
        ));
    }

    /**
     * 三阶段保存 - 获取上传地址
     *
     * @param fileId  文件id
     * @param request 上传的文件 <br>
     *                <a href = "https://solution.wps.cn/docs/callback/save.html#获取上传地址">-详见官方文档-</a>
     */
    @Operation(summary = "获取上传地址", description = "三阶段保存 - 获取上传地址")
    @PostMapping("/{file_id}/upload/address")
    public ResponseDTO<FileUploadMultiPhase.FileUploadAddress.Response> getUploadAddress(
            @PathVariable("file_id") String fileId,
            @RequestBody FileUploadMultiPhase.FileUploadAddress.Request request,
            @RequestHeader(WebOfficeHeader.X_WEB_OFFICE_TOKEN)
            String xWebOfficeToken) {

        request.setFileId(fileId);
        FileUploadMultiPhase.FileUploadAddress.Response response = multiPhaseFileStorageService.uploadAddress(request);
        response.setExtraHeaders(
                Map.of(WebOfficeHeader.X_WEB_OFFICE_TOKEN, xWebOfficeToken)
        );
        return ResponseDTO.success(response);
    }

    /**
     * 三阶段保存 - 上传完成后，回调通知上传结果
     *
     * @param fileId  文件id
     * @param request 上传的文件 <br>
     *                <a href = "https://solution.wps.cn/docs/callback/save.html#上传完成后，回调通知上传结果">-详见官方文档-</a>
     */
    @Operation(summary = "上传完成后，回调通知上传结果", description = "三阶段保存 - 上传完成后，回调通知上传结果")
    @PostMapping("/{file_id}/upload/complete")
    public ResponseDTO<FileInfoVo> uploadComplete(
            @PathVariable("file_id") String fileId,
            @RequestBody FileUploadMultiPhase.FileUploadComplete.Request request) {
        if (ObjectUtil.isNull(request)) {
            throw new WebOfficeException(WebOfficeErrEnum.INVALID_REQUEST);
        }

        request.setFileId(fileId);

        // 这里可以添加逻辑来处理上传完成后的结果
        // 例如，保存文件信息到数据库等

        return ResponseDTO.success(multiPhaseFileStorageService.uploadComplete(request));
    }

    /**
     * 文件上传(历史版本)
     *
     * @param content 文件
     * @return ApiResult<FileUploadVO>
     */
    @Operation(summary = "上传新版本", description = "上传新版本的文件")
    @PutMapping("/{fileId}/upload/newVersion")
    public ResponseDTO<String> uploadNewVersion(
            @RequestBody byte[] content,
            @PathVariable String fileId) {
        String userId = AuthUtil.getCurrentUser().getUserId();

        return ResponseDTO.success(fileHistoryService.uploadNewVersion(fileId, content, userId));
    }


}
